From: Keir Fraser Date: Thu, 18 Jun 2009 09:30:28 +0000 (+0100) Subject: Introduce page_list_move() X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~13730 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=c92018768b91b5250bb41fbc0e29e21f86b89ac2;p=xen.git Introduce page_list_move() This not only allows to remove ia64's special implementation of page_list_splice_init(), but also fixes the latent issue with the direct list head assignment in the x86 code if that would ever get switched back to using normal list entries for linking together pages (i.e. whenever x86-64 is to support more tha 16Tb of memory). Signed-off-by: Jan Beulich --- diff --git a/xen/arch/ia64/xen/domain.c b/xen/arch/ia64/xen/domain.c index f69fdb820a..bdc31323c9 100644 --- a/xen/arch/ia64/xen/domain.c +++ b/xen/arch/ia64/xen/domain.c @@ -1705,7 +1705,7 @@ static int relinquish_memory(struct domain *d, struct page_list_head *list) } } - page_list_splice_init(&d->arch.relmem_list, list); + page_list_move(list, &d->arch.relmem_list); out: spin_unlock_recursive(&d->page_alloc_lock); diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 201c9eb457..48b41a2bda 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -1818,11 +1818,7 @@ static int relinquish_memory( } /* list is empty at this point. */ - if ( !page_list_empty(&d->arch.relmem_list) ) - { - *list = d->arch.relmem_list; - INIT_PAGE_LIST_HEAD(&d->arch.relmem_list); - } + page_list_move(list, &d->arch.relmem_list); out: spin_unlock_recursive(&d->page_alloc_lock); diff --git a/xen/include/asm-ia64/mm.h b/xen/include/asm-ia64/mm.h index e8803ba9b1..a94264615c 100644 --- a/xen/include/asm-ia64/mm.h +++ b/xen/include/asm-ia64/mm.h @@ -92,24 +92,6 @@ struct page_info u32 tlbflush_timestamp; }; -#ifndef page_list_entry -static inline void -page_list_splice_init(struct page_list_head *list, struct page_list_head *head) -{ - if ( !page_list_empty(list) ) - { - if ( head->next ) - head->tail->list.next = page_to_mfn(list->next); - else - head->next = list->next; - head->tail = list->tail; - INIT_PAGE_LIST_HEAD(list); - } -} -#else -# define page_list_splice_init list_splice_init -#endif - #define set_page_count(p,v) atomic_set(&(p)->_count, v - 1) /* diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h index 50c47b00e2..71e3181e2a 100644 --- a/xen/include/xen/mm.h +++ b/xen/include/xen/mm.h @@ -223,7 +223,15 @@ page_list_remove_head(struct page_list_head *head) return page; } - +static inline void +page_list_move(struct page_list_head *dst, struct page_list_head *src) +{ + if ( !page_list_empty(src) ) + { + *dst = *src; + INIT_PAGE_LIST_HEAD(src); + } +} static inline void page_list_splice(struct page_list_head *list, struct page_list_head *head) { @@ -281,6 +289,8 @@ page_list_splice(struct page_list_head *list, struct page_list_head *head) list_del(&__pg->list); \ __pg; \ }) : NULL) +# define page_list_move(dst, src) (!list_empty(src) ? \ + list_replace_init(src, dst) : (void)0) # define page_list_for_each(pos, head) list_for_each_entry(pos, head, list) # define page_list_for_each_safe(pos, tmp, head) \ list_for_each_entry_safe(pos, tmp, head, list)